#!/bin/bash
# 启动myrpc服务(后台运行)
##<-- service运行
# 指定运行脚本的帐户名
#service_user=user
#[ $(whoami) != $service_user ] && su - $service_user
#config="/home/$service_user/.myrpc/config.properties"
# 设置脚本执行路径
#sh_folder=
##-->
#<--命令行执行
config="$HOME/.myrpc/config.properties"
# 指定服务工作文件夹,用于 service 管理系统服务时要修改此变量为固定常量
service_folder=$(cd "$(dirname $0)"; pwd -P)
# 指定运行脚本日志输出文件
service_out='myrpc.out'
#-->
## 读取properties中的参数，并创建参数名命名的变量，如果参数名中包含'.'则替换为'-'
if [ -f "$config" ]
then
	echo "load property from $config"
	while IFS='=' read -r key value
	do
		# '.'替换为'-'
		key=$(echo $key | tr '.' '_')
		## 不处理＃起始的key
		[[ -z $(echo "$key" | grep -P '\s*#+.*' ) ]] \
			&& eval "${key}='${value}'"  
	done < "$config"
else
	echo "$config not found."
fi

[ -z "$server_port" ] && server_port=28081

# 通过端口号获取当前运行的myrpc进程id,没有返回空
function myrpc_pid(){
	local facelotcp=$(netstat -nap 2>/dev/null | grep ":::$server_port")	
	echo $facelotcp | grep -P '\d+/java' -o | grep -P '\d+' -o
}
# 判断指定的PID是否为myrpc进程,是返回0,否则返回-1
function is_myrpc_pid(){
	local w=$(ps -ef | grep $1 | grep -P 'java\s+.*-jar\s+myrpc-service-.+\.jar')
	[ -n "$w" ] && echo 0 && return
	echo -1
}
## 返回myrpc服务状态　0在线，-1不在线
function status_code(){
	local pid=$(myrpc_pid)
	
	# 检测myrpc是否正常运行
	[ -n "$pid" ] \
		&& [ $(is_myrpc_pid $pid) -eq 0 ] \
		&& echo 0 && return 
	echo -1
}
## 显示myrpc服务状态
function status(){
	local pid=$(myrpc_pid)
	
	# 检测myrpc是否正常运行
	[ $(status_code) -eq 0 ] && echo "myrpc    [ON] PID $pid PORT $server_port" && return
	echo "myrpc    [OFF]" 
}
## 停止myrpc
function stop(){
	if [ $(status_code) -eq 0 ] 
	then
		local pid=$(myrpc_pid)
		kill -9 $pid && echo "myrpc $pid killed" 
	fi
}
## 启动myrpc
function start(){
	# 是否挂起
	local no_hang_up=0;
	# 是否输出重定向
	local redirect=" > $service_out 2>&1";
	# 解析输入参数
	while [ $# -ge 1 ] ; do
		case "$1" in
			-u|--hup) no_hang_up=1; shift 1;;
			-s|--stdout) redirect='' ; shift 1;;
			*) echo "无效参数 $1." ; exit 255;;
		esac
	done
	echo "启动 myrpc 服务(start myrpc service)..."
	[ -n "$redirect" ] && echo "执行 tail -f $service_folder/myrpc.out 查看控制台输出"
	# 检测myrpc是否正常运行
	local code=$(status_code)
	local pid=$(myrpc_pid)
	[ $code -ne 0 ] \
		&& [ -n "$pid" ] \
		&& [ $(is_myrpc_pid $pid) -ne 0 ] \
		&& echo "ERROR:myrpc port $server_port occupied by PID $pid " && return -1

	if [ $code -ne 0 ]
	then
		if [ $no_hang_up -eq 0 ] 
		then		
			eval nohup ./$folder/target/start_myrpc_server.sh $var $redirect &
			# 延迟等待myrpc服务启动
			sleep 5
			status
		else
			eval ./$folder/target/start_myrpc_server.sh $var  $redirect
		fi
	fi	
}

[ -z "$sh_folder" ] && sh_folder=$(cd "$(dirname $0)"; pwd -P)
pushd $sh_folder > /dev/null 2>&1
case $1 in
	start)
		shift 1;
		start $*
		;;
	stop)
		stop
		;;
	status)
		status				
		;;
	restart|force-reload)
		stop
		start
		;;
	*)
		echo "Usage: /etc/init.d/myrpc {start|stop|restart|force-reload|status}"
		exit 1
		;;
esac
popd > /dev/null 2>&1